package com.xy.iot.common.utils;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;

import java.io.File;
import java.util.List;

/**
 * Excel 相关操作
 */
public class ExcelUtil {
    /**
     *  导出excel
     * @param list 需要写入的数据
     * @param sheetName  sheet名称
     * @param clazz 实体类
     * @param path 文件路径
     * @param <T>
     */
    public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, String path) {
        ExcelWriterSheetBuilder builder = EasyExcel.write(new File(path), clazz)
                .autoCloseStream(false)
                // 自动适配
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                // 大数值自动转换 防止失真
                .sheet(sheetName);
        builder.doWrite(list);
    }

    /**
     * 写入追加
     * @param list 需要写入的数据
     * @param sheetName sheet名称
     * @param clazz 实体类
     * @param fileName 文件名
     * @param filePath 文件路径
     * @param <T>
     */
    public static <T> void writeAppend(List<T> list, String sheetName, Class<T> clazz,String fileName,String filePath) {
        File templateFile = new File(filePath, fileName);
        File destFile = new File(filePath, "test.xlsx");
        ExcelWriter excelWriter = null;
        try {
            if (templateFile.exists()) {
                //追加数据，目标文件与原始文件不能是同一个文件名
                //withTemplate()指定模板文件
                excelWriter = EasyExcel.write().withTemplate(templateFile)
                        //.file() 指定目标文件，不能与模板文件是同一个文件
                        .file(destFile).autoCloseStream(false).build();
            } else {
                excelWriter = EasyExcel.write(templateFile, clazz)
                        .build();
            }
            WriteSheet writeSheet = EasyExcel.writerSheet(sheetName)
                    .build();
            excelWriter.write(list, writeSheet);
        } finally {
            // 千万别忘记finish 会帮忙关闭流
            if (excelWriter != null) {
                excelWriter.finish();
            }
        }

        if (destFile.exists()) {
            //删除原模板文件，新生成的文件变成新的模板文件
            templateFile.delete();
            destFile.renameTo(templateFile);
        }
    }
}